package com.suiwei.base;

import com.suiwei.base.common.Student;
import com.suiwei.mybatisPlus.entity.Book;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.beanutils.BeanUtils;
import org.junit.jupiter.api.Test;

import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

/**
 * @author suiwei
 * @date 2023-02-01 13:10
 */
//所有类都直接或者间接的继承了Object类；
@Slf4j
public class ObjectDemo {
  @Test
  void  base(){
    Student stu1 =new Student();
    Student stu2 =new Student();
    //打印对象名的时候，会自动调用该对象的toString方法
    //Object类的toString方法：全类名+@+地址值（对象内存地址+哈希算法算出来的16进制哈希值）；
    //该地址值没有意义，所以自己创建类的时候一般都会重写toString；很多类，比如ArrayList已经重写过toString了
    System.out.println(stu1);
    //==：基本类型比较值，引用类型比较地址值
    System.out.println(stu2 == stu1);//false
    //Object中的equals默认比较的是对象内存地址（就是==），一般都需要重写，重写后用来比较对象的成员变量值是否相等
    System.out.println(stu1.equals(stu2));//false；重写equals后为true
    //Objects类的equals方法内部带有非null判断，自己写equals的话，需要先判断不为null
    //不过，还是需要重写Student类的equal方法才行
    System.out.println(Objects.equals(stu1, stu2));
  }

  // 需要pom文件导入
  // 一般使用的BeanUtils是Apache Commons组件的成员之一；要用于简化JavaBean封装数据的操作
  // BeanUtils是浅拷贝。
  //    浅拷贝：在进行深拷贝时，会拷贝所有的属性，并且如果这些属性是对象，也会对这些对象进行深拷贝，直到最底层的基本数据类型为止。
  //        这意味着，对于深拷贝后的对象，即使原对象的属性值发生了变化，深拷贝后的对象的属性值也不会受到影响。
  //    深拷贝：只会拷贝对象的第一层属性，如果这些属性是对象，则不会对这些对象进行拷贝，而是直接复制对象的引用。
  //        这意味着，对于浅拷贝后的对象，如果原对象的“对象属性”值发生了变化，浅拷贝后的对象的属性值也会跟着发生变化，不过基本类型的属性不变
  //
  @Test
  void BeanUtils() throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
    Book book1 = new Book();
    book1.setId(1);
    book1.setName("tom");
    book1.setDescription("描述");
    Book book2 = new Book();
    // 属性复制
    BeanUtils.copyProperties(book2, book1);
    // 将map集合的键值对信息封装到对应的JavaBean对象当中去
    Map map = new HashMap<>();
    map.put("id", 2);
    map.put("name", "map");
    BeanUtils.populate(book2, map);
  }
}


